package com.twod.feralvillage;

import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;

public class EventReporter implements Runnable {
        public final static int EVENT_DEATH = 0;
        public final static int EVENT_BEAT_LEVEL = 1;
        public final static int EVENT_BEAT_GAME = 2;
        
        public final static String REPORT_SERVER = null; // insert your server here.
        
        private class Event {
                public String eventType;
                public float x;
                public float y;
                public float time;
                public String level;
                public int version;
                public long session;
        }
        
        private Object mLock = new Object();
        private ArrayList<Event> mEvents = new ArrayList<Event>();
        private ArrayList<Event> mProcessedEvents = new ArrayList<Event>();
        private boolean mDone = false;

        public void run() {
                while (!mDone) {
                        synchronized(mLock) {
                    if (mEvents.isEmpty()) {
                        while (mEvents.isEmpty() && !mDone) {
                            try {
                                mLock.wait();
                            } catch (InterruptedException e) {
                            }
                        }
                    }
                    
                    mProcessedEvents.addAll(mEvents);
                    mEvents.clear();
                }
                        
                        final int count = mProcessedEvents.size();
                        for (int x = 0; x < count; x++) {
                                recordEvent(mProcessedEvents.get(x));
                        }
                        
                        mProcessedEvents.clear();
                }
        }
        
        public void addEvent(int eventType, float x, float y, float time, String level, int version, long session) {
                Event event = new Event();
                event.x = x;
                event.y = y;
                event.time = time;
                event.level = level;
                event.version = version;
                event.session = session;
                switch (eventType) {
                        case EVENT_DEATH:
                                event.eventType = "death";
                                break;
                        case EVENT_BEAT_LEVEL:
                                event.eventType = "beatLevel";
                                break;
                        case EVENT_BEAT_GAME:
                                event.eventType = "beatGame";
                                break;
                }
                synchronized(mLock) {
                        mEvents.add(event);
                        mLock.notifyAll();
                }
        }
        
        public void recordEvent(Event event) {
        URL serverAddress = null;
        HttpURLConnection connection = null;

        if (REPORT_SERVER != null) {
                try {
                    serverAddress = new URL(REPORT_SERVER + "?"
                                + "event=" + event.eventType
                                + "&x=" + event.x
                                + "&y=" + event.y
                                + "&time=" + event.time
                                + "&level=" + URLEncoder.encode(event.level, "UTF-8")
                                + "&version=" + event.version
                                + "&session=" + event.session);
                    //set up out communications stuff
                    connection = null;
                  
                    //Set up the initial connection
                    connection = (HttpURLConnection)serverAddress.openConnection();
                       
                    connection.setRequestMethod("GET");
                    connection.setDoOutput(true);
                    connection.setReadTimeout(0);
                    
                    connection.connect();
                    final int response = connection.getResponseCode();
                    DebugLog.d("Report Event", event.eventType + "  " + response + ":" + connection.getURL().toString());
        
                 
                              
                } catch (Exception e) {
                   // This code can silently fail.
                        //e.printStackTrace();
                }
                finally
                {
                    //close the connection
                    connection.disconnect();
                    connection = null;
                }
        }

    }
        
        public void stop() {
                synchronized(mLock) {
                        mDone = true;
                        mLock.notifyAll();
                }
        }

}
